﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PersonalAccounting.Business;

namespace PersonalAccounting.Forms
{
    public partial class FormCuentaManagement : Form
    {

        #region Atributtes

        private CuentaFacade facade;
        private Cuenta cuenta;
        private ListViewItem item;

        #endregion


        #region Form

        public FormCuentaManagement()
        {
            facade = new CuentaFacade();
            cuenta = new Cuenta();

            InitializeComponent();
        }

        private void FormCuentaManagement_Load(object sender, EventArgs e)
        {
            cboMoneda.CargarMonedas();
            CargarCuentas();
        }

        #endregion


        #region Click

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            if (DatosOk())
                Agregar();
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (DatosOk())
                Modificar();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            string mensaje  = "¿Desea eliminar la cuenta?\n" +
                        "Se eliminarán todos los movimientos de la misma.";
            DialogResult dr = MessageBox.Show(mensaje, this.Text,
                MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (dr == DialogResult.Yes)
                Eliminar();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        #endregion

        #region SelectedIndexChanged

        private void lvCuentas_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvCuentas.SelectedItems.Count > 0)
            {
                item = lvCuentas.SelectedItems[0];
                MostrarCuenta();
            }
            else
            {
                item = null;
                LimpiarCuenta();
            }
            txtNombre.Focus();
        }

        #endregion



        private bool DatosOk()
        {
            if (txtNombre.Text.Length == 0)
            {
                MessageBox.Show("Debe indicar un nombre.", this.Text,
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtNombre.Focus();
                return false;
            }
            return true;
        }


        private void Agregar()
        {
            cuenta.Codigo = facade.GetNextCode();
            cuenta.Moneda = cboMoneda.Value;
            cuenta.Nombre = txtNombre.Text;

            facade.Insert(cuenta);

            LimpiarCuenta();
            CargarCuentas();
            lvCuentas.Focus();
        }

        private void Modificar()
        {
            cuenta.Codigo = int.Parse(txtCodigo.Text);
            cuenta.Moneda = cboMoneda.Value;
            cuenta.Nombre = txtNombre.Text;

            facade.Update(cuenta);

            LimpiarCuenta();
            CargarCuentas();
            lvCuentas.Focus();
        }

        private void Eliminar()
        {
            cuenta.Codigo = int.Parse(txtCodigo.Text);

            facade.Delete(cuenta);

            LimpiarCuenta();
            CargarCuentas();
            lvCuentas.Focus();
        }


        private void CargarCuentas()
        {
            lvCuentas.Items.Clear();
            foreach (Cuenta cuenta in facade.GetAll())
            {
                ListViewItem item = lvCuentas.Items.Add(cuenta.Codigo.ToString());

                item.SubItems.Add(cuenta.Moneda.ToString());
                item.SubItems.Add(cuenta.Nombre);

                item.Tag = cuenta;

                if (item.Index % 2 != 0)
                    item.BackColor = Color.WhiteSmoke;
            }
        }

        private void MostrarCuenta()
        {
            Cuenta cta = (Cuenta)item.Tag;

            txtCodigo.Text = cta.Codigo.ToString();
            cboMoneda.Value = cta.Moneda;
            txtNombre.Text = cta.Nombre;

            btnAgregar.Visible = false;
            btnModificar.Visible = true;
            btnEliminar.Visible = true;
        }

        private void LimpiarCuenta()
        {
            txtCodigo.Clear();
            cboMoneda.SelectedIndex = 0;
            txtNombre.Clear();

            btnAgregar.Visible = true;
            btnModificar.Visible = false;
            btnEliminar.Visible = false;
        }
    }
}
